﻿#ifndef GraphNodeTypes_h__
#define GraphNodeTypes_h__

/********************************************************************
	创建于:		2011/03/17
	创建于:		17:3:2011   21:21
	基本文件:	GraphNodeTypes
	文件扩展:	h
	作者:		王凯
	
	目的:		该代码主要思想来自于Mat先生的GrapNodeTypes，我将他的代码通过自己的方式创建起来。
				代码主要用来图算法中的顶点类型描述，方便使用在各种图算法中。
*********************************************************************/
#include <ostream>
#include "2D/Vector2D.h"
#include "NodeTypeEnumerations.h"

class GraphNode
{
protected:
	//顶点索引，有效值应为>=0
	int	m_index;

public:
	//无参数的构造
	GraphNode():m_index(invalid_node_index){}
	//带参数的构造
	GraphNode(int index):m_index(index){}
	virtual ~GraphNode(){}

	//对输出操作符进行重载
	friend std::ostream& operator<<(std::ostream& os,const GraphNode& n)
	{
		os<<"Index:"<<n.m_index<<std::endl;
		return os;
	}
	//对索引信息进行读写操作
	int		Index()const{	return m_index;}
	void	SetIndex(const int i){	m_index = i;}
};

//////////////////////////////////////////////////////////////////////////
//
//
//
//////////////////////////////////////////////////////////////////////////
template<class Extra_Info = void*>
class NavGraphNode : public GraphNode
{
protected:
	//保存顶点位置信息
	Vector2D m_Postion;

	//这个指针用来存储一些额外的信息，方便日后扩展
	Extra_Info m_ExtraInfo;
public:
	//无参数的构造
	NavGraphNode():m_ExtraInfo(Extra_Info()){}
	//带参数的构造
	NavGraphNode(int index, Vector2D pos):
		GraphNode(index), 
		m_Postion(pos),
		m_ExtraInfo(Extra_Info()){}

	~NavGraphNode(){}

	//对位置信息进行读写操作
	Vector2D Pos() const{ return m_Postion;}
	void SetPos(const Vector2D newPos){ m_Postion = newPos;}
	//对额外信息进行读写操作
	Extra_Info ExtraInfo() const{ return m_ExtraInfo;}
	void SetExtraInfo(Extra_Info newInfo){ m_ExtraInfo = newInfo;}

	//
	friend std::ostream& operator<<(std::ostream& os, const NavGraphNode& n)
	{
		os<<"Index:"<<n.m_index<<" PosX:"<<n.m_Postion.x<<" PosY:"<<n.m_Postion.y<<std::endl;
		return os;
	}
};

#endif // GraphNodeTypes_h__